using UnityEngine;

// 英雄系统使用示例
// 这个示例展示了如何在游戏中使用英雄系统
public class HeroSystemUsageExample : MonoBehaviour
{
    void Start()
    {
        Debug.Log("=== 英雄系统使用示例 ===");
        
        // 1. 获取英雄列表模型
        var heroListModel = ModelManager.GetModel<HeroListModel>();
        
        // 2. 添加监听器
        heroListModel.AddHeroListChangedListener(OnHeroListChanged);
        
        // 3. 创建一些英雄
        CreateInitialHeroes();
        
        // 4. 演示各种操作
        StartCoroutine(DemonstrateOperations());
    }
    
    void CreateInitialHeroes()
    {
        var heroListModel = ModelManager.GetModel<HeroListModel>();
        
        // 创建初始英雄
        var heroes = new[]
        {
            new HeroModel(1, "亚瑟") { Level = 5, Star = 3 },
            new HeroModel(2, "妲己") { Level = 3, Star = 2 },
            new HeroModel(3, "孙悟空") { Level = 1, Star = 1 }
        };
        
        // 解锁一些英雄
        heroes[0].Unlock();
        heroes[1].Unlock();
        
        // 添加到列表
        foreach (var hero in heroes)
        {
            heroListModel.AddHero(hero);
        }
        
        Debug.Log($"创建了 {heroes.Length} 个初始英雄");
    }
    
    System.Collections.IEnumerator DemonstrateOperations()
    {
        var heroListModel = ModelManager.GetModel<HeroListModel>();
        
        yield return new WaitForSeconds(2f);
        
        // 演示1: 添加新英雄
        Debug.Log("--- 演示1: 添加新英雄 ---");
        var newHero = new HeroModel(4, "赵云");
        newHero.Level = 2;
        newHero.Star = 1;
        heroListModel.AddHero(newHero);
        
        yield return new WaitForSeconds(2f);
        
        // 演示2: 英雄升级
        Debug.Log("--- 演示2: 英雄升级 ---");
        var hero = heroListModel.GetHero(1);
        if (hero != null)
        {
            hero.LevelUp();
            hero.StarUp();
        }
        
        yield return new WaitForSeconds(2f);
        
        // 演示3: 解锁英雄
        Debug.Log("--- 演示3: 解锁英雄 ---");
        var lockedHero = heroListModel.GetHero(3);
        if (lockedHero != null)
        {
            lockedHero.Unlock();
        }
        
        yield return new WaitForSeconds(2f);
        
        // 演示4: 查询英雄
        Debug.Log("--- 演示4: 查询英雄 ---");
        var unlockedHeroes = heroListModel.GetUnlockedHeroes();
        Debug.Log($"已解锁英雄数量: {unlockedHeroes.Count}");
        
        var highStarHeroes = heroListModel.GetHeroesByStar(3);
        Debug.Log($"3星及以上英雄数量: {highStarHeroes.Count}");
        
        yield return new WaitForSeconds(2f);
        
        // 演示5: 删除英雄
        Debug.Log("--- 演示5: 删除英雄 ---");
        heroListModel.RemoveHero(2);
        
        yield return new WaitForSeconds(2f);
        
        Debug.Log("=== 演示完成 ===");
    }
    
    void OnHeroListChanged(HeroListChangedEventArgs args)
    {
        switch (args.Type)
        {
            case HeroListChangedEventArgs.ChangeType.Added:
                Debug.Log($"[事件] 添加英雄: {args.Hero.HeroName} (ID: {args.Hero.HeroId})");
                break;
            case HeroListChangedEventArgs.ChangeType.Removed:
                Debug.Log($"[事件] 删除英雄: {args.Hero.HeroName} (ID: {args.Hero.HeroId})");
                break;
            case HeroListChangedEventArgs.ChangeType.Updated:
                Debug.Log($"[事件] 英雄属性更新: {args.Hero.HeroName} (ID: {args.Hero.HeroId})");
                break;
        }
    }
    
    void OnDestroy()
    {
        // 清理监听器
        var heroListModel = ModelManager.GetModel<HeroListModel>();
        if (heroListModel != null)
        {
            heroListModel.RemoveHeroListChangedListener(OnHeroListChanged);
        }
    }
}

// 游戏管理器示例 - 展示如何在游戏逻辑中使用英雄系统
public class GameManager : MonoBehaviour
{
    private HeroListModel _heroListModel;
    
    void Start()
    {
        _heroListModel = ModelManager.GetModel<HeroListModel>();
        
        // 监听英雄变化
        _heroListModel.AddHeroListChangedListener(OnHeroListChanged);
        
        // 监听单个英雄属性变化
        var firstHero = _heroListModel.GetHero(1);
        if (firstHero != null)
        {
            firstHero.AddPropertyChangedListener(OnHeroPropertyChanged);
        }
    }
    
    // 抽卡获得英雄
    public void DrawHero()
    {
        int newHeroId = Random.Range(100, 999);
        string[] heroNames = { "关羽", "张飞", "马超", "黄忠", "典韦" };
        string randomName = heroNames[Random.Range(0, heroNames.Length)];
        
        var newHero = new HeroModel(newHeroId, randomName);
        newHero.Level = Random.Range(1, 5);
        newHero.Star = Random.Range(1, 4);
        
        _heroListModel.AddHero(newHero);
        
        Debug.Log($"抽卡获得英雄: {randomName}");
    }
    
    // 英雄升级
    public void UpgradeHero(int heroId)
    {
        var hero = _heroListModel.GetHero(heroId);
        if (hero != null)
        {
            hero.LevelUp();
            Debug.Log($"英雄 {hero.HeroName} 升级成功");
        }
    }
    
    // 英雄升星
    public void StarUpHero(int heroId)
    {
        var hero = _heroListModel.GetHero(heroId);
        if (hero != null)
        {
            hero.StarUp();
            Debug.Log($"英雄 {hero.HeroName} 升星成功");
        }
    }
    
    // 分解英雄
    public void DecomposeHero(int heroId)
    {
        if (_heroListModel.RemoveHero(heroId))
        {
            Debug.Log($"英雄 ID {heroId} 分解成功");
        }
    }
    
    void OnHeroListChanged(HeroListChangedEventArgs args)
    {
        // 处理英雄列表变化
        switch (args.Type)
        {
            case HeroListChangedEventArgs.ChangeType.Added:
                // 新英雄获得，可以播放特效、音效等
                PlayHeroObtainEffect(args.Hero);
                break;
            case HeroListChangedEventArgs.ChangeType.Removed:
                // 英雄被删除，可以播放分解特效
                PlayHeroDecomposeEffect(args.Hero);
                break;
            case HeroListChangedEventArgs.ChangeType.Updated:
                // 英雄属性更新，可以更新UI
                UpdateHeroUI(args.Hero);
                break;
        }
    }
    
    void OnHeroPropertyChanged(ModelPropertyChangedEventArgs args)
    {
        // 处理单个英雄属性变化
        var hero = args.Target as HeroModel;
        if (hero != null)
        {
            Debug.Log($"英雄 {hero.HeroName} 的 {args.PropertyName} 从 {args.OldValue} 变为 {args.NewValue}");
            
            // 根据属性变化类型执行不同逻辑
            switch (args.PropertyName)
            {
                case nameof(HeroModel.Level):
                    PlayLevelUpEffect(hero);
                    break;
                case nameof(HeroModel.Star):
                    PlayStarUpEffect(hero);
                    break;
                case nameof(HeroModel.IsUnlocked):
                    PlayUnlockEffect(hero);
                    break;
            }
        }
    }
    
    // 特效播放方法（示例）
    void PlayHeroObtainEffect(HeroModel hero)
    {
        Debug.Log($"播放获得英雄特效: {hero.HeroName}");
    }
    
    void PlayHeroDecomposeEffect(HeroModel hero)
    {
        Debug.Log($"播放分解英雄特效: {hero.HeroName}");
    }
    
    void UpdateHeroUI(HeroModel hero)
    {
        Debug.Log($"更新英雄UI: {hero.HeroName}");
    }
    
    void PlayLevelUpEffect(HeroModel hero)
    {
        Debug.Log($"播放升级特效: {hero.HeroName}");
    }
    
    void PlayStarUpEffect(HeroModel hero)
    {
        Debug.Log($"播放升星特效: {hero.HeroName}");
    }
    
    void PlayUnlockEffect(HeroModel hero)
    {
        Debug.Log($"播放解锁特效: {hero.HeroName}");
    }
    
    void OnDestroy()
    {
        // 清理监听器
        if (_heroListModel != null)
        {
            _heroListModel.RemoveHeroListChangedListener(OnHeroListChanged);
        }
    }
} 